home *** CD-ROM | disk | FTP | other *** search
- #pragma inline
- #include <conio.h>
- #include <stdio.h>
-
-
- extern long *SIN, *COS;
- int xtrans, ytrans, ztrans;
- int xang, yang, zang;
- long scal;
-
- typedef struct
- {
- int x,y;
- } VERTEX_2D;
-
- typedef struct
- {
- int color, lados, ptr;
- VERTEX_2D *vertice;
- } POL_2D;
-
- typedef struct
- {
- int x,y,z;
- } VERTEX_3D;
-
- typedef struct
- {
- int vis, lados, color, ptr, norm_ptr;
- } POL_3D;
-
- typedef struct
- {
- int num_of_pols, num_of_ptrs,num_of_verts;
- int pointer_ptr, vertice_ptr;
- POL_3D far *pol;
- int far *pointer;
- VERTEX_3D far *vertice;
- } OBJECT;
-
- int zmin[100]; //z's para el sorting
- /********************FUNCIONES PARA OBJETOS COMPLETOS***********************/
-
- void swap_P3D( POL_3D far *pol, int a, int b )
- {
- a*=10;
- b*=10;
- asm{
- les di,pol
- mov dx,di
- add di,a
-
- mov eax,es:di
- mov ebx,es:[di+4]
- mov cx,es:[di+8]
-
- mov di,dx
- add di,b
- xchg es:di,eax
- xchg es:[di+4],ebx
- xchg es:[di+8],cx
- mov di,dx
- add di,a
- mov es:di,eax
- mov es:[di+4],ebx
- mov es:[di+8],cx
- };
- }
-
- void swapint( int far *a, int far *b )
- {
- asm{
- mov ax,[a]
- xchg ax,[b]
- };
- }
-
- void sortpoly( OBJECT far *object, POL_3D far *polys,
- int far *pointers, VERTEX_3D far *vertex )
- { int cuenta, cuenta1, cuenta2, lados;
- int ptr0, ptr1, pols, numpol, z;
-
- // ACCESO AL OBJETO
- asm{ //obtener el numero de polígonos
- les di,object
- mov ax,es:di
- mov numpol,ax
- };
-
- cuenta1=0;
- //ACCESO A LOS POL╓GONOS
- looper1:
- asm{
- mov bx,cuenta1
- mov ax,10
- mul bl
- les di,polys
- add di,ax
- mov ax,es:[di+6]
- mov ptr0,ax
- mov ax,es:[di+2]
- mov lados,ax
- };
- //GETMINZ para un polígono
- for( cuenta=0, z=-32000; cuenta<lados; cuenta++)
- {
- ptr1=pointers[ptr0+cuenta];
- if( vertex[ptr1].z > z )
- z=vertex[ptr1].z;
- };
-
- zmin[cuenta1]=z;
- cuenta1++;
-
- if(cuenta1<numpol)
- goto looper1;
-
- //SORTPOLYS poner en orden todos los polígonos
- cuenta1=0;
- while(cuenta1<numpol)
- {
- for( cuenta2=cuenta1+1; cuenta2<numpol; cuenta2++)
- if(zmin[cuenta1] <= zmin[cuenta2])
- {
- swap_P3D( polys, cuenta1, cuenta2 );
- swapint((int far *)&zmin[cuenta1], (int far *)&zmin[cuenta2]);
- };
- cuenta1++;
- };
- }
-
- void getpoly( POL_3D far *list, int far *vertxlist,
- VERTEX_2D far *polylist,
- VERTEX_2D far *salida, int far *col,
- int far *sides, int numpol )
- { int cuenta, ptr0, ptr1, lados, color;
-
- // ptr=list[numpol].ptr;
- asm{
- mov bx,numpol
- mov ax,10
- mul bl
- les di,list
- add di,ax
- mov ax,es:[di+6]
- mov ptr0,ax
- mov ax,es:[di+4]
- mov color,ax
- mov ax,es:[di+2]
- mov lados,ax
- };
-
- sides[0]=lados;
- col[0]=color;
-
- for( cuenta=0; cuenta<lados; cuenta++)
- {
- ptr1=vertxlist[ptr0+cuenta];
-
- salida[cuenta].x=polylist[ptr1].x;
- salida[cuenta].y=polylist[ptr1].y;
- };
- }
-
- void getpoly_3D( POL_3D far *list, int far *vertxlist,
- VERTEX_3D far *polylist,
- VERTEX_3D far *salida, int numpol )
- { int cuenta, ptr0, ptr1, lados, color;
-
- // ptr=list[numpol].ptr;
- asm{
- mov bx,numpol
- mov ax,10
- mul bl
- les di,list
- add di,ax
- mov ax,es:[di+6]
- mov ptr0,ax
- mov ax,es:[di+4]
- mov color,ax
- mov ax,es:[di+2]
- mov lados,ax
- };
-
-
- for( cuenta=0; cuenta<lados; cuenta++)
- {
- ptr1=vertxlist[ptr0+cuenta];
-
- salida[cuenta].x=polylist[ptr1].x;
- salida[cuenta].y=polylist[ptr1].y;
- salida[cuenta].z=polylist[ptr1].z;
- };
- }
-
-
- /**********************FUNCIONES PARA 3 DIMENSIONES*************************/
- /*
- void getnormals( *POL_3D far *list, int far *vertxlist,
- VERTEX_3D far *polylist,
- VERTEX_3D far *buffer,
- VERTEX_3D far *salida, int pols )
- { int cuenta, dummy;
-
- for( cuenta=0; cuenta<pols; cuenta++ )
- {
- getpoly_3D( list, vertxlist, polylist, buffer, int cuenta );
-
-
-
-
-
- */
- void rotate( VERTEX_3D far *pol, int lados, int xang, int yang, int zang )
- { int cuenta;
- long bufferx, buffery, bufferz, seno, coseno, x, y, z;
-
- for(cuenta=0; cuenta<=lados; cuenta++)
- {
- seno=SIN[xang&255];
- coseno=COS[xang&255];
-
- buffery=(long)pol[cuenta].y;
- bufferz=(long)pol[cuenta].z;
-
- buffery*=coseno;
- bufferz*=seno;
- buffery-=bufferz;
- buffery>>=16;
- y=buffery;
-
- buffery=(long)pol[cuenta].y;
- bufferz=(long)pol[cuenta].z;
- buffery*=seno;
- bufferz*=coseno;
- buffery+=bufferz;
- buffery>>=16;
- pol[cuenta].y=(int)y;
- pol[cuenta].z=(int)buffery;
-
- seno=SIN[yang&255];
- coseno=COS[yang&255];
-
- bufferx=(long)pol[cuenta].x;
- bufferz=(long)pol[cuenta].z;
-
- bufferx*=coseno;
- bufferz*=seno;
- bufferx-=bufferz;
- bufferx>>=16;
- x=bufferx;
-
- bufferx=(long)pol[cuenta].x;
- bufferz=(long)pol[cuenta].z;
- bufferx*=seno;
- bufferz*=coseno;
- bufferx+=bufferz;
- bufferx>>=16;
- pol[cuenta].x=(int)x;
- pol[cuenta].z=(int)bufferx;
-
- seno=SIN[zang&255];
- coseno=COS[zang&255];
-
- bufferx=(long)pol[cuenta].x;
- buffery=(long)pol[cuenta].y;
-
- bufferx*=coseno;
- buffery*=seno;
- bufferx-=buffery;
- bufferx>>=16;
- x=bufferx;
-
- bufferx=(long)pol[cuenta].x;
- buffery=(long)pol[cuenta].y;
- bufferx*=seno;
- buffery*=coseno;
- bufferx+=buffery;
- bufferx>>=16;
- pol[cuenta].x=(int)x;
- pol[cuenta].y=(int)bufferx;
-
- };
- }
-
- void translate( VERTEX_3D far *pol, int lados, int xt, int yt, int zt )
- { int cuenta;
- for( cuenta=0; cuenta<=lados; cuenta++)
- {
- pol[cuenta].x+=xt;
- pol[cuenta].y+=yt;
- pol[cuenta].z+=zt;
- };
- }
-
- void z_persp( VERTEX_3D far *pol, int lados )
- { int cuenta;
- long x, y, z, cons;
- for(cuenta=0; cuenta<=lados; cuenta++)
- {
- z=(long)pol[cuenta].z; //xo=x-x*(z/(z+256))
- if(z<-300L)
- {
- // printf("Z demasiado grande");
- return;
- };
- cons=z;
- cons<<=16;
- cons/=(z+600);
- x=(long)pol[cuenta].x;
- x*=cons;
- x>>=16;
- y=(long)pol[cuenta].y;
- y*=cons;
- y>>=16;
- pol[cuenta].x-=(int)x;
- pol[cuenta].y-=(int)y;
- };
- }
-
- void zoom( VERTEX_3D far *pol, int lados )
- { int cuenta;
- long x, y, z;
-
- for(cuenta=0; cuenta<=lados; cuenta++ )
- {
- x=(long)pol[cuenta].x;
- x*=scal;
- x>>=16;
- y=(long)pol[cuenta].y;
- y*=scal;
- y>>=16;
- pol[cuenta].x=(int)x;
- pol[cuenta].y=(int)y;
- };
- }
-
- void copypoly3d( VERTEX_3D far *origen, VERTEX_3D far *destino, int lados )
- {
- asm{
- mov cx,lados
- mov bx,cx
- add bx,cx
- add bx,cx
- push ds
- lds si,origen
- les di,destino
- mov cx,1
- and cx,bx //numero de bytes excedentes
- rep movsw
- mov cx,bx
- shr cx,1
- rep movsd //dos palabras por vez
- pop ds
- };
- }
-
- void copy3to2d( VERTEX_3D far *orig, VERTEX_2D far *dest, int lados )
- {
- asm{
- mov cx,lados
- push ds
- lds si,orig
- les di,dest
- };
- label:
- asm{
- movsd
- add si,2
- loop label
- pop ds
- };
- }
-
- /**********************FUNCIONES PARA DOS DIMENSIONES***********************/
-
- void polyclip( VERTEX_2D far *pol, int lados )
- { int cuenta;
-
- for( cuenta=0; cuenta<=lados; cuenta++ )
- {
- if(pol[cuenta].x>319)
- pol[cuenta].x=319;
- if(pol[cuenta].x<0)
- pol[cuenta].x=0;
- if(pol[cuenta].y>199)
- pol[cuenta].y=199;
- if(pol[cuenta].y<0)
- pol[cuenta].y=0;
- };
- }
-
- void copypoly2d( VERTEX_2D far *origen, VERTEX_2D far *destino, int lados )
- {
- asm{
- mov cx,lados
- push ds
- lds si,origen
- les di,destino
- rep movsd //dos palabras por vez
- pop ds
- };
- }
-
- void mat2vid( VERTEX_2D far *verts, int lados )
- {
- asm mov cx,lados
- asm les di,verts
- inicio:
- asm{
- mov eax,es:di
- add ax,160
- rol eax,16
- add ax,100
- rol eax,16
- stosd
- loop inicio
- };
- }
-
- void mat2vid_3D( VERTEX_3D far *verts, int lados )
- {
- asm mov cx,lados
- asm les di,verts
- inicio:
- asm{
- mov eax,es:di
- add ax,160
- rol eax,16
- add ax,100
- rol eax,16
- stosd
- add di,2
- loop inicio
- };
- }
-
-